package dto

import (
	"fmt"
	"gitee.com/captials-team/ubdframe/src/common/consts"
	"gitee.com/captials-team/ubdframe/src/common/utils"
	"strconv"
	"strings"
)

type SearchMetricMetaDto struct {
	Keywords string `json:"keywords"` //关键字搜索
}

type SearchMetricDataDto struct {
	MetricId  int64 `json:"metric_id"` //指定测点
	StartTime int64 `json:"start_time"`
	EndTime   int64 `json:"end_time"`
}

type SearchMetricStatDto struct {
	MetricId  int64  `json:"metric_id"` //指定测点
	StatType  string `json:"stat_type"` //统计类型，类似：1m,1h,1d
	DataType  string `json:"data_type"` //数据类型，last/avg/min/max/sum/add(增量)
	Timestamp int64  `json:"timestamp"`
	StartTime int64  `json:"start_time"`
	EndTime   int64  `json:"end_time"`
}

type QueryMetricStatDto struct {
	MetricId  int64  `json:"metric_id"` //指定测点
	StatType  string `json:"stat_type"` //统计类型，类似：1m,1h,1d
	DataType  string `json:"data_type"` //数据类型，last/avg/min/max/sum/add(增量)
	Timestamp int64  `json:"timestamp"`
	StartTime int64  `json:"start_time"`
	EndTime   int64  `json:"end_time"`
}

type CleanMetricDataDto struct {
	MetricId   int64  `json:"metric_id"` //指定测点
	StartTime  int64  `json:"start_time"`
	EndTime    int64  `json:"end_time"`
	ExpireTime int64  `json:"expire_time"` //制定过期时间
	Table      string `json:"table"`       //指定table
	MaxRow     int64  `json:"max_row"`     //清理最大行数
}

// TimeDim (TimeDimension) 统计时间维度
type TimeDim struct {
	Value int64  `json:"value"`
	Unit  string `json:"unit"` // m：分钟级别，h：小时级，d：日级别，mo： 月级别，y：年级别

	TimeZone string `json:"timeZone"` //时区
}

func (dim TimeDim) String() string {
	return fmt.Sprintf("%d%s", dim.Value, dim.Unit)
}

// TimeFormat 时间对齐
func (dim TimeDim) TimeFormat(timestamp int64) int64 {
	zone := dim.TimeZone
	if zone == "" {
		zone = "Asia/Shanghai"
	}
	switch dim.Unit {
	case consts.MinuteAbbr:
		return utils.UnixMilliFixUnit(timestamp, dim.Value*60*1000)
	case consts.HourAbbr:
		return utils.UnixMilliFixUnit(timestamp, dim.Value*60*60*1000)
	case consts.DayAbbr:
		t0 := utils.UnixMilliFixUnit(timestamp, dim.Value*24*60*60*1000)
		d, _ := utils.UnixMilliToZeroHour(t0, zone)
		return d
	case consts.MonthAbbr:
		//月只支持value=1
		d, _ := utils.UnixMilliToMonth(timestamp, zone)
		return d
	case consts.YearAbbr:
		//年只支持value=1
		d, _ := utils.UnixMilliToYear(timestamp, zone)
		return d
	}

	return timestamp
}

func ParseTimeDim(s string) TimeDim {
	var dim TimeDim
	var times = []string{
		consts.MinuteAbbr,
		consts.HourAbbr,
		consts.DayAbbr,
		consts.MonthAbbr,
		consts.YearAbbr,
	}

	for _, v := range times {
		if strings.HasSuffix(s, v) {
			dim.Unit = v
			dim.Value, _ = strconv.ParseInt(strings.Replace(s, v, "", -1), 10, 64)
			return dim
		}
	}

	return dim
}
